home *** CD-ROM | disk | FTP | other *** search
- #include "stdio.h"
- #include "osbind.h"
- #include "gemdefs.h"
- #define TRUE 1
-
- /*** GEM bindings ***/
-
- extern int gl_apid;
- int contrl[12], intin[128], ptsin[128], intout[128], ptsout[128];
- int work_in[11], work_out[57];
- int gem_handle;
-
- int points, xy[1200];
- float max_x, max_y, min_x, min_y, xr[600], yr[600];
- char title[80];
- FILE *data;
-
- main()
- {
- int i;
- char filename[64];
-
- /*** initialize GEM ***/
-
- appl_init();
- for (i=0; i<10; work_in[i++]=1);
- work_in[10]=0;
- v_opnvwk(work_in, &gem_handle, work_out);
-
- while (TRUE)
- { if (!get_file(filename)) break;
- data = fopen(filename, "r");
- if (data == NULL)
- { printf("Could not open file %s\n", filename);
- Bconin(2);
- graf_mouse(M_ON, 0L);
- return;
- }
- get_xy();
- scale_xy();
- plot_xy();
- graf_mouse(M_ON, 0L);
- }
-
- graf_mouse(M_ON, 0L);
- }
-
- get_file(fullfilename) char fullfilename[64];
- {
- int i, button_status, drive;
- static char filename[15]={" "}, pathname[52]={" "};
-
- if (strcmp(pathname, " ") == 0)
- { drive = Dgetdrv();
- pathname[0] = drive+'A';
- pathname[1] = ':';
- Dgetpath(&pathname[2], 0);
- strcat(pathname, "\\*.DAT");
- }
-
- graf_mouse(M_OFF, 0L); v_curhome(gem_handle); v_eeos(gem_handle);
- graf_mouse(M_ON, 0L);
- fsel_input(pathname, filename, &button_status);
- graf_mouse(M_OFF, 0L); v_curhome(gem_handle); v_eeos(gem_handle);
- if (button_status == NIL)
- { graf_mouse(M_ON, 0L);
- return(FALSE);
- }
- for (i=strlen(pathname)-1;
- (pathname[i] != '\\') && (pathname[i] != ':');
- i--);
- strncpy(fullfilename, pathname, ++i);
- fullfilename[i] = '\0';
- strcat(fullfilename, filename);
- return(TRUE);
- }
-
- get_xy()
- {
- max_x = -8.0e28;
- max_y = -8.0e28;
- min_x = 8.0e28;
- min_y = 8.0e28;
-
- fscanf(data, "%[^\n]", title);
- points = 0;
- while (fscanf(data, "%f %f", &xr[points], &yr[points]) == 2)
- { if (xr[points] > max_x) max_x = xr[points];
- if (xr[points] < min_x) min_x = xr[points];
- if (yr[points] > max_y) max_y = yr[points];
- if (yr[points] < min_y) min_y = yr[points];
- points++;
- }
- points--;
- }
-
- scale_xy()
- {
- int i;
- float scale_x, scale_y;
-
- scale_x = 600 / (max_x - min_x);
- scale_y = 360 / (max_y - min_y);
- for (i=0; i<=points; i++)
- { xr[i] = (xr[i] - min_x) * scale_x + 40;
- yr[i] = 360 - (yr[i] - min_y) * scale_y;
- }
- }
-
- plot_xy()
- {
- int i, j, offset, point2, dummy;
- static int border[8]={40, 0, 40, 360, 40, 360, 640, 360};
-
- j = 0;
- for (i=0; i <= points; i++)
- { xy[j++] = xr[i];
- xy[j++] = yr[i];
- }
- printf("\33E");
- v_pline(gem_handle, 4, border);
- vsm_type(gem_handle, 3);
- vsm_height(gem_handle, 2);
- point2 = points << 1;
- for (offset=0; offset<point2; offset += 100)
- { if (offset+100 <= point2)
- { v_pmarker(gem_handle, 100, &xy[offset]);
- v_pline(gem_handle, 100, &xy[offset]);
- }
- else
- { v_pmarker(gem_handle, (points+1) % 50, &xy[offset]);
- v_pline(gem_handle, (points+1) % 50, &xy[offset]);
- }
- }
-
- label_axis();
- Bconin(2);
- }
-
- label_axis()
- {
- static int x_axis[30]={40, 360, 80, 360, 120, 360, 160, 360, 200, 360,
- 240, 360, 280, 360, 320, 360, 360, 360, 400, 360, 440, 360, 480, 360,
- 520, 360, 560, 360, 600, 360};
-
- static int y_axis[26]={40, 0, 40, 30, 40, 60, 40, 90, 40, 120, 40, 150,
- 40, 180, 40, 210, 40, 240, 40, 270, 40, 300, 40, 330, 40, 360};
-
- int i, dummy;
- char label[40];
- float x_inc, y_inc;
-
- vsm_height(gem_handle, 2);
- vsm_type(gem_handle, 2);
- v_pmarker(gem_handle, 15, x_axis);
- v_pmarker(gem_handle, 13, y_axis);
-
- vst_point(gem_handle, 0, &dummy, &dummy, &dummy, &dummy);
- x_inc = (max_x - min_x) / 15;
- y_inc = (max_y - min_y) / 13;
-
- for (i=0; i<15; i++)
- { format(min_x + x_inc * i, label);
- v_gtext(gem_handle, 20 + i*40, 380, label);
- }
-
- for (i=0; i<13; i++)
- { format(max_y - y_inc * (i+1), label);
- v_gtext(gem_handle, 2, i*30, label);
- }
-
- vst_point(gem_handle, 9, &dummy, &dummy, &dummy, &dummy);
- i = ((80 - strlen(title)) >> 1) << 3;
- v_gtext(gem_handle, i, 396, title);
-
- }
-
- format(x, label) float x; char label[];
- {
- if (x<10.0)
- sprintf(label, "%6.3f", x);
- else if (x<100.0)
- sprintf(label, "%6.2f", x);
- else if (x<1000.0)
- sprintf(label, "%6.1f", x);
- else if (x<100000.0)
- sprintf(label, "%6.0f", x);
- else
- sprintf(label, "%6.1e", x);
- }
-